using CommunityToolkit.Mvvm.Input;
using NavigateExample.Services.Dialog;

namespace NavigateExample.ViewModels
{
    public partial class AboutDialogViewModel : ViewModelBase, IDialogAware
    {
        [ObservableProperty]
        private bool allowClose = true;
        [ObservableProperty]
        private string dialogTitle = "关于";
        [ObservableProperty]
        private string? message;
        [ObservableProperty]
        private string? version;
        [ObservableProperty]
        private string? appName = "NavigateExample";
        public string Title => DialogTitle;
        //对话框关闭时候触发的事件， IDialogAware接口定义的
        //ViewModel不应该直接操作View,应该通过事件在Service层控制对话框的关闭
        //DialogResult除了可以传递用户的选择结果(OK、Cancel、None)
        //还可以通过DialogResult.DialogParameters额外的返回数据->子传父
        //事件触发的时候会调用callback(result)
        public event Action<IDialogResult>? RequestClose;
        [RelayCommand]
        void ToggleClosePermission()
        {
            // 切换关闭权限，用于演示CanCloseDialog的作用
            AllowClose = !AllowClose;
        }

        [RelayCommand]
        void Close()
        {
            // 关闭对话框，返回OK结果
            var result = new DialogResult(ButtonResult.OK);
            // DialogService处理了通过RequestClose事件关闭以及点击右上角X关闭(相当于按下ESC)
            // 通过RequestClose关闭更好，因为能传递参数
            RequestClose?.Invoke(result);
        }
        [RelayCommand]
        void Cancel()
        {
            // 取消对话框，返回Cancel结果
            var result = new DialogResult(ButtonResult.Cancel);
            RequestClose?.Invoke(result);
        }

        #region IDialogAware Implementation
        public void OnDialogOpened(DialogParameters parameters)
        {
            // 从参数中获取传递的信息
            if (parameters.ContainsKey("Title"))
            {
                DialogTitle = parameters.GetValue<string>("Title", "关于");
            }
            if (parameters.ContainsKey("Message"))
            {
                Message = parameters.GetValue<string>("Message");
            }
            if (parameters.ContainsKey("Version"))
            {
                Version = parameters.GetValue<string>("Version");
            }
        }
        public void OnDialogClosed()
        {
            // 对话框关闭时的清理工作
        }

        public bool CanCloseDialog()
        {
            // 演示验证逻辑：只有当AllowClose为true时才能关闭
            // 在实际应用中，这里可以添加更复杂的验证逻辑：
            // - 表单数据验证
            // - 未保存数据检查
            // - 权限检查等
            return AllowClose;
        }
        #endregion
    }
}